'use strict';

var nameEntryFactory = require('./implementation/Name'),
    createCategoryValue = require('../../../helper/CategoryHelper').createCategoryValue,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;

module.exports = function (group, element, bpmnFactory, canvas, translate) {

    function initializeCategory(semantic) {
        var rootElement = canvas.getRootElement(),
            definitions = getBusinessObject(rootElement).$parent,
            categoryValue = createCategoryValue(definitions, bpmnFactory);

        semantic.categoryValueRef = categoryValue;

    }

    function setGroupName(element, values) {
        var bo = getBusinessObject(element),
            categoryValueRef = bo.categoryValueRef;

        if (!categoryValueRef) {
            initializeCategory(bo);
        }

        // needs direct call to update categoryValue properly
        return {
            cmd: 'element.updateLabel',
            context: {
                element: element,
                newLabel: values.categoryValue
            }
        };
    }

    function getGroupName(element) {
        var bo = getBusinessObject(element),
            value = (bo.categoryValueRef || {}).value;

        return {categoryValue: value};
    }

    if (!is(element, 'bpmn:Collaboration')) {

        var options;
        if (is(element, 'bpmn:TextAnnotation')) {
            options = {modelProperty: 'text', label: translate('Text')};
        } else if (is(element, 'bpmn:Group')) {
            options = {
                modelProperty: 'categoryValue',
                label: translate('Category Value'),
                get: getGroupName,
                set: setGroupName
            };
        }

        // name
        group.entries = group.entries.concat(nameEntryFactory(element, options, translate));

    }

};
